#ifndef AUDIODECODER_H
#define AUDIODECODER_H

#include "../data/AudioFrame.h"
#include <QString>
#include <QMutex>

extern "C" {
    #include <libavutil/rational.h>
}

struct AVFormatContext;
struct AVCodecContext;
struct SwrContext;
struct AVFilterGraph;
struct AVFilterContext;
  

class AudioDecoder
{
public:
    AudioDecoder();
    ~AudioDecoder();


    //打开音频文件
    bool openAudio(const QString& audioPath);

    //关闭音频文件
    void closeAudio();

    //解码一帧
    AudioFrame decodeFrame(bool& isEof);


    //跳转到指定位置
    bool seek(int64_t positionMs);

    //获取音频信息
    int getSampleRate() const;
    int getChannels() const;
    int64_t getDurationMs() const;
    bool isOpened() const;
    QString getError() const;
    SwrContext* getSwrContext() const;  // 获取重采样器（用于AudioOutput）
    
    // 设置播放倍速（0.5 ~ 2.0）
    bool setSpeed(double speed);


private:
    void freeResources();
    void setError(const QString& error, int ffmpegErrCode = -1);
    bool initResampler();               // 改名：initSwrContext → initResampler
    bool initFilter(double speed);      // 初始化音频滤镜
    void freeFilter();                  // 释放滤镜资源

    AVFormatContext* m_formatContext;
    AVCodecContext* m_codecContext;
    int m_audioStreamIndex;
    AVRational m_audioTimeBase;
    
    SwrContext* m_swrContext;           // 重采样器
    
    // 音频滤镜（用于倍速）
    AVFilterGraph* m_filterGraph;
    AVFilterContext* m_filterSrc;       // 滤镜输入
    AVFilterContext* m_filterSink;      // 滤镜输出
    double m_currentSpeed;              // 当前倍速
    
    int m_sampleRate;                   // 采样率
    int m_channels;                     // 声道数
    int64_t m_durationMs;               // 时长
    
    bool m_isOpen;
    QString m_error;
    
    mutable QMutex m_mutex;

};  // 添加分号

#endif
